/*
 * DIM-SUM操作系统 - 线程描述符
 *
 * Copyright (C) 2023 国科础石(重庆)软件有限公司
 *
 * 作者: Dong Peng <w-pengdong@kernelsoft.com>
 *
 * License terms: GNU General Public License (GPL) version 3
 *
 */

#ifndef __ASM_THREAD_INFO_H
#define __ASM_THREAD_INFO_H

#ifdef __KERNEL__
#define STACK_ALIGN		16
#define PROCESS_STACK_SIZE 16384

#ifndef __ASSEMBLY__

#include <linux/compiler.h>

struct process_desc;

/**
 * 该结构用于进程彻底被删除时使用
 * 由于进程在退出时很多数据结构仍然
 * 被CPU使用，而不能立即释放内存，
 * 比如mmu的页表，在删除进程内存时
 * 进程并没有被调度出去，这时删除
 * mmu页表显然会导致系统崩溃。特别
 * 是用户态和内核态使用同一个
 * mmu root页表的情况
 */
struct arch_process_destroy {
	void*	save_exitmmu_l1;	/* 保存进程退出MMU root页的指针 */
	void*	svae_there;
};

/**
 * 体系结构特定的，任务描述符
 * 将被放入通用结构process_desc中
 */
struct arch_process_desc {
	unsigned long	kernel_sp;			/* 内核栈指针 */
	unsigned long	user_sp;			/* 用户栈指针 */
	struct exception_spot* regs_sp; 	/* 当前的exception_spot指针 */
	struct arch_process_destroy arch_destroy;
};

static inline struct process_desc *current_proc_info(void)
{
		register unsigned long sp asm ("sp");
		return (struct process_desc *)(sp & ~(PROCESS_STACK_SIZE - 1));
}

static inline void set_tp_reg(unsigned long tp)
{
	asm volatile(
		"move tp, %[TP]\n\t"
		::[TP] "r" (tp):"memory"
	);
}

register unsigned long current_stack_pointer asm ("sp");

#define thread_saved_pc(tsk)	\
	((unsigned long)(tsk->task_spot.cpu_context.pc))
#define thread_saved_sp(tsk)	\
	((unsigned long)(tsk->task_spot.cpu_context.sp))
#define thread_saved_fp(tsk)	\
	((unsigned long)(tsk->task_spot.cpu_context.s[0]))

#endif /* __ASSEMBLY__ */
#endif /* __KERNEL__ */
#endif /* __ASM_THREAD_INFO_H */
